package uebung11;

import java.awt.Color;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

import acm.graphics.GLabel;
import acm.graphics.GRect;
import acm.program.GraphicsProgram;

public class BarChart extends GraphicsProgram {
  private static final long serialVersionUID = 1L;
  private static int WIDTH = 600;
  private static int HEIGHT = 400;
  private static int GAP = 20;


  //TODO Fuer die Sortierung sollte entweder ein neues Attribut mit
  // den fuer die Sortierung heranzuziehenden Daten deklariert werden
  // (dann zusammen mit get/set-Methoden), oder die Methode displayDiagram
  // um einen parameter erweitert werden.
  // Passen Sie die Klasse bzw. die Methode entsprechend an.
  // Anschliessend ist die Reihenfolge der Zeichenbefehle in displayDiagram
  // so anzupassen, dass die Eintraege aufsteigend sortiert angezeigt werden.


  /**
   * Display a bar chart of data. The parameter ymax specifies the 
   * scaling of the y axis.
   * 
   * @param data the data to display
   * @param ymax the maximum of the y-axis
   * @param position the positions of the bars as they are in the 
   */
  public void displayDiagram(Map<String, Double> data, double ymax, int[] positions) {
    // clean the canvas
    removeAll();
    
    // compute bar width
   
    int barWidth = (WIDTH - GAP * (data.size() - 1)) / data.size();
    
    // compute bar unit height
    double barUnitHeight = HEIGHT / ymax;
    
    // x of lower left corner of next bar
    int x = 0;
    int i = 0;
    setBackground(Color.WHITE);
                
    for (Object o: data.entrySet()) {
      Map.Entry e = (Map.Entry) o;
      Double v = (Double) e.getValue();
      GRect bar = new GRect(barWidth, barUnitHeight * v);
      bar.setColor(Color.BLACK);
      int position = positions[i];
      x = position * (barWidth + GAP);
      add(bar, x, HEIGHT + 1 - barUnitHeight * v);
      GLabel lbl = new GLabel((String) e.getKey());
      lbl.setColor(Color.BLACK);
      //center label in bar
      add(lbl, x + (barWidth - lbl.getWidth()) / 2, HEIGHT);
      i++;
    }
  }
  
  /**
   * Opens a window with an example bar chart.
   * You do not need to change this method!
   * @param args command line arguments are not used in this exercise 
   */
  public static void main(String[] args) {
    BarChart b = new BarChart();
    b.start();

    Map<String, Double> data = new HashMap<String, Double>();
    data.put("0 - 4", 3.0);
    data.put("5 - 9", 7.0);
    data.put("10 - 14", 1.0);

    // puts first at position 2, second at position 0 and third at position 1
    int[] ar = { 2, 0, 1};
    b.displayDiagram(data, 8, ar);
  }
}
